package com.jing.yuntuku.service.impl;

import com.jing.yuntuku.exception.BusinessException;
import com.jing.yuntuku.exception.ErrorCode;
import com.jing.yuntuku.service.OssPictureUploadTemplate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;

/**
 * OSS图片上传实现类：处理URL字符串输入
 */
@Slf4j
public class UrlOssUploader extends OssPictureUploadTemplate {

    // 允许的图片格式后缀（与原有validPictureUrl方法一致）
    private static final String[] ALLOWED_PIC_EXTS = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"};


    // -------------------------- 实现抽象类的差异化方法 --------------------------
    /**
     * 1. 验证输入源（URL字符串）有效性
     */
    @Override
    protected void validPicture(Object inputSource) {
        // 1.1 验证输入源类型
        if (!(inputSource instanceof String)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "输入源不是有效的URL字符串");
        }
        String fileUrl = (String) inputSource;

        // 1.2 验证URL非空
        if (!StringUtils.hasText(fileUrl)) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "图片URL不能为空");
        }

        // 1.3 验证URL格式合法
        try {
            new URL(fileUrl);
        } catch (MalformedURLException e) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "图片URL格式无效");
        }

        // 1.4 验证URL是图片格式（后缀匹配）
        String urlLower = fileUrl.toLowerCase();
        boolean isValidPicExt = Arrays.stream(ALLOWED_PIC_EXTS).anyMatch(urlLower::endsWith);
        if (!isValidPicExt) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "URL不是有效的图片格式");
        }
    }

    /**
     * 2. 提取原始文件名（从URL中获取）
     */
    @Override
    protected String getOriginFilename(Object inputSource) {
        String fileUrl = (String) inputSource;
        try {
            URL url = new URL(fileUrl);
            String path = url.getPath();
            // 截取URL路径中最后一个斜杠后的部分作为原始文件名
            return path.substring(path.lastIndexOf('/') + 1);
        } catch (MalformedURLException e) {
            // URL格式已验证，此处用时间戳兜底
            return System.currentTimeMillis() + "_url_pic";
        }
    }

    /**
     * 3. 处理文件（从URL下载图片到临时文件）
     */
    @Override
    protected void processFile(Object inputSource, File tempFile) throws IOException {
        String fileUrl = (String) inputSource;
        // 用缓冲流从URL下载图片到临时文件
        try (InputStream in = new URL(fileUrl).openStream();
             FileOutputStream out = new FileOutputStream(tempFile)) {

            byte[] buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = in.read(buffer)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
        } catch (IOException e) {
            log.error("从URL下载图片到临时文件失败，URL：{}，临时路径：{}", fileUrl, tempFile.getAbsolutePath(), e);
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "URL图片下载失败");
        }
    }
}